
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>

int main() {
    AVFormatContext *in_fmt_ctx = NULL;
    AVFormatContext *out_fmt_ctx = NULL;
    AVCodecContext *dec_ctx = NULL, *enc_ctx = NULL;
    const AVCodec *decoder, *encoder;
    
    // 打开输入视频文件
    avformat_open_input(&in_fmt_ctx, "input.mp4", NULL, NULL);
    avformat_find_stream_info(in_fmt_ctx, NULL);
    
    // 创建输出上下文（MP4格式）
    avformat_alloc_output_context2(&out_fmt_ctx, NULL, NULL, "output.mp4");
    
    // 配置视频编码器（H.264）
    encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
    enc_ctx = avcodec_alloc_context3(encoder);
    enc_ctx->width = 1280;
    enc_ctx->height = 720;
    enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
    enc_ctx->time_base = (AVRational){1, 25};
    
    // 转码处理循环...
    // (完整实现包含数据包读取、解码、编码、写入流程)
    // 视频转码循环（H.264转MP4示例）
    while( 1 ) {
        AVFrame * frame = av_frame_alloc();
        AVPacket * pkt = av_packet_alloc();

        // 读取输入包
        int ret = av_read_frame( in_fmt_ctx, pkt );
        if( ret < 0 ) break;

        if( pkt->stream_index == video_stream_idx ) {
            // 发送到解码器
            avcodec_send_packet( dec_ctx, pkt );

            // 接收解码帧
            while( avcodec_receive_frame( dec_ctx, frame ) >= 0 ) {
                // 缩放帧（分辨率转换）
                sws_scale( sws_ctx, frame->data, frame->linesize, 0,
                    dec_ctx->height, enc_frame->data, enc_frame->linesize );

                // 发送到编码器
                avcodec_send_frame( enc_ctx, enc_frame );

                // 接收编码包
                while( avcodec_receive_packet( enc_ctx, pkt ) >= 0 ) {
                    av_packet_rescale_ts( pkt, enc_ctx->time_base,
                        out_fmt_ctx->streams[0]->time_base );
                    av_interleaved_write_frame( out_fmt_ctx, pkt );
                }
            }
        }
        av_packet_unref( pkt );
        av_frame_free( &frame );
    }

    avformat_close_input(&in_fmt_ctx);
    avformat_free_context(out_fmt_ctx);
    return 0;
}
